layui.define(['jquery', 'element', 'constants', 'toast','nprogress'],
    function (exports) {

        // 引入依赖
        var $ = layui.jquery;
        var toast = layui.toast;
        var constants = layui.constants;
        var nprogress = layui.nprogress;

        // 使用常量拼接接口地址
        var API_BASE_URL = constants.API_BASE_URL;

        // 定义工具类
        var AjaxUtils = {
            /**
             * 发送 AJAX 请求
             * @param {Object} options 请求配置
             * @param {Function} successCallback 成功回调
             * @param {Function} errorCallback 失败回调
             */
            request: function (options, successCallback, errorCallback) {
                // 默认配置
                var defaultOptions = {
                    url: '',
                    type: 'GET',
                    data: null,
                    dataType: 'json',
                    contentType: 'application/json',
                    headers: {}
                };

                // 合并用户配置和默认配置
                var config = $.extend({}, defaultOptions, options);

                // 统一添加请求头（如 token）
                config.headers = $.extend({}, config.headers, this.getCommonHeaders());
        
                nprogress.start(); // 开始加载进度条
                // 发送请求
                $.ajax({
                    url: API_BASE_URL + config.url,
                    type: config.type,
                    data: JSON.stringify(config.data),
                    dataType: config.dataType,
                    contentType: config.contentType,
                    headers: config.headers,
                    success: function (response) {
                        // 统一处理成功响应
                        if (response.code === 200) {
                            successCallback && successCallback(response.data);
                            nprogress.done(); // 结束加载进度条
                        } else if (response.code === 520) {
                            nprogress.done(); // 结束加载进度条
                            // 未登录，跳转到登录页
                            AjaxUtils.redirectToLogin();
                        } else {
                            nprogress.done(); // 结束加载进度条
                            // 其他业务错误
                            errorCallback && errorCallback(response.msg || '请求失败');
                        }
                    },
                    error: function (xhr, status, error) {
                        nprogress.done(); // 结束加载进度条
                        // 统一处理异常
                        AjaxUtils.handleError(xhr, status, error, errorCallback);
                    }
                });
            },

            /**
             * 获取公共请求头
             * @returns {Object} 公共请求头
             */
            getCommonHeaders: function () {
                return {
                    'token': localStorage.getItem('token'), // 从本地存储获取 token
                    'X-Requested-With': 'XMLHttpRequest'
                };
            },

            /**
             * 处理异常
             * @param {Object} xhr XMLHttpRequest 对象
             * @param {String} status 错误状态
             * @param {String} error 错误信息
             * @param {Function} errorCallback 失败回调
             */
            handleError: function (xhr, status, error, errorCallback) {
                if (xhr.status === 401) {
                    // 未登录，跳转到登录页
                    this.redirectToLogin();
                } else {
                    // 其他异常
                    var errorMessage = '服务器异常：' + (xhr.responseJSON?.message || error);
                    errorCallback && errorCallback(errorMessage);
                }
            },

            /**
             * 跳转到登录页
             */
            redirectToLogin: function () {
                // 清除本地存储的 token
                localStorage.removeItem('token');
                // 跳转到登录页
                toast.error({
                    message: '登陆失效，请重新登陆',
                });
                setTimeout(function () {
                    location.href = "/login.html";
                }, 2500);
            }
        };

        exports('AjaxUtils', AjaxUtils);
    })
